
<!DOCTYPE html>
<html lang="zh-cn">
    
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="generator" content="ML3426&#39;s Lair">
    <title>ASM学习笔记0 - Hello World - ML3426&#39;s Lair</title>
    <meta name="author" content="ML3426">
    
    
    
    <script type="application/ld+json">{"@context":"http://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"ML3426","sameAs":["https://github.com/ML3426","https://weibo.com/ML3426"],"image":"http://oin1tuauu.bkt.clouddn.com/avatar.jpg"},"articleBody":"最近在工作中，遇到了一个可能大部分Java开发人员都遇到过的痛点，试用了几种其他的工具类框架，发现都有不是很满意的地方，因此就有了一个主意来自己写一个。但是在我的预想中，做这个工具需要和CGLib以及ASM打交道比较多，所以就打算从ASM以及CGLib开始学起，但是要学ASM，先学好JVM和字节码是前提。一边学习我也会一边产出我自己的学习笔记希望能够帮助到更多的人。由于自己也是边学边写，很有可能会或错误或遗漏的地方，欢迎大家给我发邮件过来批评指正。\n一个简单的Hello WorldHello World是每一个程序猿在学习每一门语言最开始的小程序，虽然JVM规范的东西很多很复杂，但是我并不打算先给大家普及概念，我们先从一个Hello World来看一下Java生成的Class文件到底长啥样，然后我们就可以使用ASM自己来写一个Hello World来看看了。\nHello World字节码解析先来看一段最简单的Hello World的Java源代码：12345public class Main &#123; public static void main(String[] args) &#123; System.out.println(&quot;Hello World&quot;); &#125;&#125;\n将其保存为Main.java之后。如何将其编译成.class的二进制文件呢，可能大家平时基本都使用IDE了，一般也没有需要单独编译class文件的需求。实际上我们可以直接JDK提供的工具_javac_来完成。运行完javac Main.java之后我们发现目录下生成了一个Main.class文件，直接用一些文本编辑器打开这个class文件看的话，发现里面只有零星的几个类名，这样并不能让我们非常清楚这个class文件的内容，因此我们需要使用JDK提供的另一个工具_javap_，运行完javap -c Main之后，class文件的真容才展现在了我们的眼前，如下所示。123456789101112131415Compiled from \"Main.java\"public class Main &#123;  public Main();Code:   0: aload_0   1: invokespecial #1                  // Method java/lang/Object.\"&lt;init&gt;\":()V   4: return  public static void main(java.lang.String[]);Code:   0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;   3: ldc           #3                  // String Hello World   5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V   8: return&#125;\n这就是字节码的基本结构，与类的结构一样，都是类再加上方法以及方法的实现。下面我们简单的阅读下这一份字节码。首先是类与类的访问修饰符：public class Main。然后是第一个方法与方法的访问修饰符public Main();也就是Main这个类的构造函数。接下来是构造函数的实现，我们发现每一行字节码基本由这样的结构构成：\\&lt;index>\\&lt;opcode>[\\&lt;operand1>[\\&lt;operand2>…]][\\&lt;comment>]以1: invokespecial #1                  // Method java/lang/Object.&quot;&lt;init&gt;&quot;:()V此行为例，index就是冒号前的1，它指的是指令操作码在数组中的下标，这个数组以字节的形式来存储当前方法的Java虚拟机代码，也就可以认为\\&lt;index>是相对于方法起始处的字节偏移量。opcode就是指令的操作码的助记符，也就是invokespecial这个指令。operand是指令的操作数，一条指令可以有0个至多个操作数。也就是上面字节码中的#1。comment就是行尾注释，也就是上面字节码中的 // Method java/lang/Object.&quot;&lt;init&gt;&quot;:()V。如果操作数表示的是运行时常量池的索引，则操作数前会有井号(“#”)，在指令后会有关于这个指令的描述，如同上面指令所示。接下来我们简单对于这一份字节码进行翻译，对于构造函数来说，[(aload_0)]首先从局部变量数组中加载第一个对象引用到操作数栈的栈顶。对于一个非静态方法来说，这个第一个对象引用就是this。接下来调用父类构造函数(invokespecial)进行初始化(super())，具体调用的对象在操作数栈中，也就是刚刚被压入的this，调用方法的具体类的具体构造函数为// Method java/lang/Object.&quot;&lt;init&gt;”:()V，即调用当前对象的父类Object的构造函数。然后执行return进行返回。接下来是函数的主体main函数，首先获取一个类的静态字段值(getstatic)并放入操作数栈顶，因为System.out.println中的out对象是System类中的一个静态的字段，因此将其取出并放入到操作数栈中。接下来是将一个常量数据从常量池中提取出来(ldc)，并且压入到操作数栈中。从字节码的行尾注释中可以看出，此时提取的就是”Hello World”字符串。此时的操作数栈中的情形为：[System.out, “Hello World”]，接下来就要调用实例方法Method java/io/PrintStream.println:(Ljava/lang/String;)V，调用的对象为栈中的对象System.out，类型为java/io/PrintStream，调用的参数类型为java/lang/String，调用的参数为栈中System.out之后的元素Hello World。也就是我们代码中的System.out.println(“Hello World”)。然后执行return进行返回。\n","dateCreated":"2018-07-12T01:57:30+08:00","dateModified":"2018-07-29T05:57:46+08:00","datePublished":"2018-07-12T01:57:30+08:00","description":"最近在工作中，遇到了一个可能大部分Java开发人员都遇到过的痛点，试用了几种其他的工具类框架，发现都有不是很满意的地方，因此就有了一个主意来自己写一个。但是在我的预想中，做这个工具需要和CGLib以及ASM打交道比较多，所以就打算从ASM以及CGLib开始学起，但是要学ASM，先学好JVM和字节码是前提。一边学习我也会一边产出我自己的学习笔记希望能够帮助到更多的人。","headline":"ASM学习笔记0 - Hello World","image":["http://oin1tuauu.bkt.clouddn.com/c10e3.jpg-scale140"],"mainEntityOfPage":{"@type":"WebPage","@id":"http://ml3426.oschina.io/Study/java-asm-study-0.html"},"publisher":{"@type":"Organization","name":"ML3426","sameAs":["https://github.com/ML3426","https://weibo.com/ML3426"],"image":"http://oin1tuauu.bkt.clouddn.com/avatar.jpg","logo":{"@type":"ImageObject","url":"http://oin1tuauu.bkt.clouddn.com/avatar.jpg"}},"url":"http://ml3426.oschina.io/Study/java-asm-study-0.html","keywords":"Java Bytecode, ASM, Java","thumbnailUrl":"http://oin1tuauu.bkt.clouddn.com/c10e3.jpg-scale140"}</script>
    <meta name="description" content="最近在工作中，遇到了一个可能大部分Java开发人员都遇到过的痛点，试用了几种其他的工具类框架，发现都有不是很满意的地方，因此就有了一个主意来自己写一个。但是在我的预想中，做这个工具需要和CGLib以及ASM打交道比较多，所以就打算从ASM以及CGLib开始学起，但是要学ASM，先学好JVM和字节码是前提。一边学习我也会一边产出我自己的学习笔记希望能够帮助到更多的人。">
<meta name="keywords" content="Java Bytecode,ASM,Java">
<meta property="og:type" content="blog">
<meta property="og:title" content="ASM学习笔记0 - Hello World">
<meta property="og:url" content="http://ml3426.oschina.io/Study/java-asm-study-0.html">
<meta property="og:site_name" content="ML3426&#39;s Lair">
<meta property="og:description" content="最近在工作中，遇到了一个可能大部分Java开发人员都遇到过的痛点，试用了几种其他的工具类框架，发现都有不是很满意的地方，因此就有了一个主意来自己写一个。但是在我的预想中，做这个工具需要和CGLib以及ASM打交道比较多，所以就打算从ASM以及CGLib开始学起，但是要学ASM，先学好JVM和字节码是前提。一边学习我也会一边产出我自己的学习笔记希望能够帮助到更多的人。">
<meta property="og:locale" content="zh-cn">
<meta property="og:updated_time" content="2018-07-28T21:57:46.367Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="ASM学习笔记0 - Hello World">
<meta name="twitter:description" content="最近在工作中，遇到了一个可能大部分Java开发人员都遇到过的痛点，试用了几种其他的工具类框架，发现都有不是很满意的地方，因此就有了一个主意来自己写一个。但是在我的预想中，做这个工具需要和CGLib以及ASM打交道比较多，所以就打算从ASM以及CGLib开始学起，但是要学ASM，先学好JVM和字节码是前提。一边学习我也会一边产出我自己的学习笔记希望能够帮助到更多的人。">
    
    
        
    
    
        <meta property="og:image" content="http://oin1tuauu.bkt.clouddn.com/avatar.jpg"/>
    
    
        <meta property="og:image" content="http://oin1tuauu.bkt.clouddn.com/c10e3.jpg-scale140"/>
        <meta class="swiftype" name="image" data-type="enum" content="http://oin1tuauu.bkt.clouddn.com/c10e3.jpg-scale140" />
    
    
    
    <!--STYLES-->
    <link rel="stylesheet" href="/assets/css/style-3frockyt2j28isvdztjchy5nhkz8tjki9ermufc1ckptmvjdftux94m2ahub.min.css">
    <!--STYLES END-->
    

    
    <script type="text/javascript">
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "//hm.baidu.com/hm.js?7a67e9c867634890c1425150399ba634";
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(hm, s);
    })();
    </script>

    <script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>
</head>

    <body>
        <div id="blog">
            <!-- Define author's picture -->


<header id="header" data-behavior="5">
    <i id="btn-open-sidebar" class="fa fa-lg fa-bars"></i>
    <div class="header-title">
        <a class="header-title-link" href="/ ">ML3426&#39;s Lair</a>
    </div>
    
        
            <a  class="header-right-icon "
                href="#about">
        
        
            <i class="fa fa-lg fa-http://oin1tuauu.bkt.clouddn.com/avatar.jpg"></i>
        
        </a>
    
</header>

            <!-- Define author's picture -->



        
    

<nav id="sidebar" data-behavior="5">
    <div class="sidebar-container">
        
            <div class="sidebar-profile">
                <a href="/#about">
                    <img class="sidebar-profile-picture" src="http://oin1tuauu.bkt.clouddn.com/avatar.jpg" alt="作者的图片"/>
                </a>
                <h4 class="sidebar-profile-name">ML3426</h4>
                
                    <h5 class="sidebar-profile-bio"><p>author.bio</p>
</h5>
                
            </div>
        
        
            <ul class="sidebar-buttons">
            
                <li class="sidebar-button">
                    
                        <a  class="sidebar-button-link "
                             href="/ "
                            
                            title="首页"
                        >
                    
                        <i class="sidebar-button-icon fa fa-home" aria-hidden="true"></i>
                        <span class="sidebar-button-desc">首页</span>
                    </a>
            </li>
            
                <li class="sidebar-button">
                    
                        <a  class="sidebar-button-link "
                             href="/all-categories"
                            
                            title="分类"
                        >
                    
                        <i class="sidebar-button-icon fa fa-bookmark" aria-hidden="true"></i>
                        <span class="sidebar-button-desc">分类</span>
                    </a>
            </li>
            
                <li class="sidebar-button">
                    
                        <a  class="sidebar-button-link "
                             href="/all-tags"
                            
                            title="标签"
                        >
                    
                        <i class="sidebar-button-icon fa fa-tags" aria-hidden="true"></i>
                        <span class="sidebar-button-desc">标签</span>
                    </a>
            </li>
            
                <li class="sidebar-button">
                    
                        <a  class="sidebar-button-link "
                             href="/all-archives"
                            
                            title="归档"
                        >
                    
                        <i class="sidebar-button-icon fa fa-archive" aria-hidden="true"></i>
                        <span class="sidebar-button-desc">归档</span>
                    </a>
            </li>
            
                <li class="sidebar-button">
                    
                        <a  class="sidebar-button-link open-algolia-search"
                             href="#search"
                            
                            title="搜索"
                        >
                    
                        <i class="sidebar-button-icon fa fa-search" aria-hidden="true"></i>
                        <span class="sidebar-button-desc">搜索</span>
                    </a>
            </li>
            
                <li class="sidebar-button">
                    
                        <a  class="sidebar-button-link "
                             href="#about"
                            
                            title="关于"
                        >
                    
                        <i class="sidebar-button-icon fa fa-question" aria-hidden="true"></i>
                        <span class="sidebar-button-desc">关于</span>
                    </a>
            </li>
            
        </ul>
        
            <ul class="sidebar-buttons">
            
                <li class="sidebar-button">
                    
                        <a  class="sidebar-button-link " href="https://github.com/ML3426" target="_blank" rel="noopener" title="同性社区">
                    
                        <i class="sidebar-button-icon fab fa-github" aria-hidden="true"></i>
                        <span class="sidebar-button-desc">同性社区</span>
                    </a>
            </li>
            
                <li class="sidebar-button">
                    
                        <a  class="sidebar-button-link " href="https://weibo.com/ML3426" target="_blank" rel="noopener" title="微博">
                    
                        <i class="sidebar-button-icon fab fa-weibo" aria-hidden="true"></i>
                        <span class="sidebar-button-desc">微博</span>
                    </a>
            </li>
            
        </ul>
        
            <ul class="sidebar-buttons">
            
                <li class="sidebar-button">
                    
                        <a  class="sidebar-button-link "
                             href="/atom.xml"
                            
                            title="RSS"
                        >
                    
                        <i class="sidebar-button-icon fa fa-rss" aria-hidden="true"></i>
                        <span class="sidebar-button-desc">RSS</span>
                    </a>
            </li>
            
        </ul>
        
    </div>
</nav>

            
            <div id="main" data-behavior="5"
                 class="
                        hasCoverMetaIn
                        ">
                
<article class="post">
    
    
        <div class="post-header main-content-wrap text-center">
    
        <h1 class="post-title">
            ASM学习笔记0 - Hello World
        </h1>
    
    
        <div class="post-meta">
    <time datetime="2018-07-12T01:57:30+08:00">
	
		    7月 12, 2018
    	
    </time>
    
        <span>发布在 </span>
        
    <a class="category-link" href="/categories/Study/">Study</a>


    
</div>

    
</div>

    
    <div class="post-content markdown">
        <div class="main-content-wrap">
            <p>最近在工作中，遇到了一个可能大部分Java开发人员都遇到过的痛点，试用了几种其他的工具类框架，发现都有不是很满意的地方，因此就有了一个主意来自己写一个。但是在我的预想中，做这个工具需要和CGLib以及ASM打交道比较多，所以就打算从ASM以及CGLib开始学起，但是要学ASM，先学好JVM和字节码是前提。一边学习我也会一边产出我自己的学习笔记希望能够帮助到更多的人。<br><a id="more"></a><br>由于自己也是边学边写，很有可能会或错误或遗漏的地方，欢迎大家给我发邮件过来批评指正。</p>
<h2 id="一个简单的Hello-World"><a href="#一个简单的Hello-World" class="headerlink" title="一个简单的Hello World"></a>一个简单的Hello World</h2><p>Hello World是每一个程序猿在学习每一门语言最开始的小程序，虽然JVM规范的东西很多很复杂，但是我并不打算先给大家普及概念，我们先从一个Hello World来看一下Java生成的Class文件到底长啥样，然后我们就可以使用ASM自己来写一个Hello World来看看了。</p>
<h3 id="Hello-World字节码解析"><a href="#Hello-World字节码解析" class="headerlink" title="Hello World字节码解析"></a>Hello World字节码解析</h3><p>先来看一段最简单的Hello World的Java源代码：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">public class Main &#123;</span><br><span class="line"> public static void main(String[] args) &#123;</span><br><span class="line"> System.out.println(&quot;Hello World&quot;);</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
<p>将其保存为Main.java之后。如何将其编译成.class的二进制文件呢，可能大家平时基本都使用IDE了，一般也没有需要单独编译class文件的需求。实际上我们可以直接JDK提供的工具_javac_来完成。<br>运行完<code>javac Main.java</code>之后我们发现目录下生成了一个Main.class文件，直接用一些文本编辑器打开这个class文件看的话，发现里面只有零星的几个类名，这样并不能让我们非常清楚这个class文件的内容，因此我们需要使用JDK提供的另一个工具_javap_，运行完<code>javap -c Main</code>之后，class文件的真容才展现在了我们的眼前，如下所示。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">Compiled from <span class="string">"Main.java"</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span> </span>&#123;</span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="title">Main</span><span class="params">()</span></span>;</span><br><span class="line">Code:</span><br><span class="line">   <span class="number">0</span>: aload_0</span><br><span class="line">   1: invokespecial #1                  // Method java/lang/Object."&lt;init&gt;":()V</span><br><span class="line">   <span class="number">4</span>: <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">  <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(java.lang.String[])</span></span>;</span><br><span class="line">Code:</span><br><span class="line">   0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;</span><br><span class="line">   3: ldc           #3                  // String Hello World</span><br><span class="line">   5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V</span><br><span class="line">   <span class="number">8</span>: <span class="keyword">return</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
<p>这就是字节码的基本结构，与类的结构一样，都是类再加上方法以及方法的实现。下面我们简单的阅读下这一份字节码。<br>首先是类与类的访问修饰符：<code>public class Main</code>。<br>然后是第一个方法与方法的访问修饰符<code>public Main();</code>也就是Main这个类的构造函数。<br>接下来是构造函数的实现，我们发现每一行字节码基本由这样的结构构成：<br><em>\&lt;index>\&lt;opcode>[\&lt;operand1>[\&lt;operand2>…]][\&lt;comment>]</em><br>以<code>1: invokespecial #1                  // Method java/lang/Object.&quot;&lt;init&gt;&quot;:()V</code>此行为例，index就是冒号前的1，它指的是指令操作码在数组中的下标，这个数组以字节的形式来存储当前方法的Java虚拟机代码，也就可以认为\&lt;index>是相对于方法起始处的字节偏移量。<br>opcode就是指令的操作码的助记符，也就是invokespecial这个指令。<br>operand是指令的操作数，一条指令可以有0个至多个操作数。也就是上面字节码中的#1。<br>comment就是行尾注释，也就是上面字节码中的 <code>// Method java/lang/Object.&quot;&lt;init&gt;&quot;:()V</code>。<br>如果操作数表示的是运行时常量池的索引，则操作数前会有井号(“#”)，在指令后会有关于这个指令的描述，如同上面指令所示。<br>接下来我们简单对于这一份字节码进行翻译，对于构造函数来说，[(aload_0)]首先从局部变量数组中加载第一个对象引用到操作数栈的栈顶。对于一个非静态方法来说，这个第一个对象引用就是this。<br>接下来调用父类构造函数(invokespecial)进行初始化(super())，具体调用的对象在操作数栈中，也就是刚刚被压入的this，调用方法的具体类的具体构造函数为<code>// Method java/lang/Object.&quot;&lt;init&gt;”:()V</code>，即调用当前对象的父类Object的构造函数。<br>然后执行return进行返回。<br>接下来是函数的主体main函数，首先获取一个类的静态字段值(getstatic)并放入操作数栈顶，因为System.out.println中的out对象是System类中的一个静态的字段，因此将其取出并放入到操作数栈中。<br>接下来是将一个常量数据从常量池中提取出来(ldc)，并且压入到操作数栈中。从字节码的行尾注释中可以看出，此时提取的就是”Hello World”字符串。<br>此时的操作数栈中的情形为：[System.out, “Hello World”]，接下来就要调用实例方法Method java/io/PrintStream.println:(Ljava/lang/String;)V，调用的对象为栈中的对象System.out，类型为java/io/PrintStream，调用的参数类型为java/lang/String，调用的参数为栈中System.out之后的元素Hello World。也就是我们代码中的System.out.println(“Hello World”)。<br>然后执行return进行返回。</p>

            

        </div>
    </div>
    <div id="post-footer" class="post-footer main-content-wrap">
        
            <div class="post-footer-tags">
                <span class="text-color-light text-small">标签</span><br/>
                
    <a class="tag tag--primary tag--small t-link" href="/tags/ASM/">ASM</a> <a class="tag tag--primary tag--small t-link" href="/tags/Java/">Java</a> <a class="tag tag--primary tag--small t-link" href="/tags/Java-Bytecode/">Java Bytecode</a>

            </div>
        
        
            <div class="post-actions-wrap">
    <nav>
        <ul class="post-actions post-action-nav">
            <li class="post-action">
                
                    
                    <a class="post-action-btn btn btn--default tooltip--top" href="/Study/java-asm-study-1.html" data-tooltip="ASM学习笔记1 - JNI字段描述符" aria-label="上一篇: ASM学习笔记1 - JNI字段描述符">
                
                    <i class="fa fa-angle-left" aria-hidden="true"></i>
                    <span class="hide-xs hide-sm text-small icon-ml">上一篇</span>
                </a>
            </li>
            <li class="post-action">
                
                    
                    <a class="post-action-btn btn btn--default tooltip--top" href="/Essay/jobhunt-exp.html" data-tooltip="求职之路经验分享" aria-label="下一篇: 求职之路经验分享">
                
                    <span class="hide-xs hide-sm text-small icon-mr">下一篇</span>
                    <i class="fa fa-angle-right" aria-hidden="true"></i>
                </a>
            </li>
        </ul>
    </nav>
    <ul class="post-actions post-action-share">
        <li class="post-action hide-lg hide-md hide-sm">
            <a class="post-action-btn btn btn--default btn-open-shareoptions" href="#btn-open-shareoptions" aria-label="Diesen Beitrag teilen">
                <i class="fa fa-share-alt" aria-hidden="true"></i>
            </a>
        </li>
        
            
            
            <li class="post-action hide-xs">
                <a class="post-action-btn btn btn--default" target="new" href="https://www.facebook.com/sharer/sharer.php?u=http://ml3426.oschina.io/Study/java-asm-study-0.html" title="分享到 Facebook">
                    <i class="fa fa-facebook-official" aria-hidden="true"></i>
                </a>
            </li>
        
            
            
            <li class="post-action hide-xs">
                <a class="post-action-btn btn btn--default" target="new" href="https://twitter.com/intent/tweet?text=http://ml3426.oschina.io/Study/java-asm-study-0.html" title="分享到 Twitter">
                    <i class="fa fa-twitter" aria-hidden="true"></i>
                </a>
            </li>
        
            
            
            <li class="post-action hide-xs">
                <a class="post-action-btn btn btn--default" target="new" href="https://plus.google.com/share?url=http://ml3426.oschina.io/Study/java-asm-study-0.html" title="分享到 Google+">
                    <i class="fa fa-google-plus" aria-hidden="true"></i>
                </a>
            </li>
        
        
            
                <li class="post-action">
                    <a class="post-action-btn btn btn--default" href="#gitment">
                         <i class="fa fa-comment-o"></i>
                    </a>
                </li>
            
        
        <li class="post-action">
            
                <a class="post-action-btn btn btn--default" href="#" aria-label="Nach oben">
            
                <i class="fa fa-list" aria-hidden="true"></i>
            </a>
        </li>
    </ul>
</div>


        
        
            
                <div id="gitment"></div>
            
        
    </div>
</article>



                <footer id="footer" class="main-content-wrap">
	<span id="busuanzi_container_site_uv">本站访客数<span id="busuanzi_value_site_uv"></span>次</span>
	<br/>
    <span class="copyrights">
        Copyrights &copy; 2018 ML3426. All Rights Reserved.
    </span>
</footer>

            </div>
            
                <div id="bottom-bar" class="post-bottom-bar" data-behavior="5">
                    <div class="post-actions-wrap">
    <nav>
        <ul class="post-actions post-action-nav">
            <li class="post-action">
                
                    
                    <a class="post-action-btn btn btn--default tooltip--top" href="/Study/java-asm-study-1.html" data-tooltip="ASM学习笔记1 - JNI字段描述符" aria-label="上一篇: ASM学习笔记1 - JNI字段描述符">
                
                    <i class="fa fa-angle-left" aria-hidden="true"></i>
                    <span class="hide-xs hide-sm text-small icon-ml">上一篇</span>
                </a>
            </li>
            <li class="post-action">
                
                    
                    <a class="post-action-btn btn btn--default tooltip--top" href="/Essay/jobhunt-exp.html" data-tooltip="求职之路经验分享" aria-label="下一篇: 求职之路经验分享">
                
                    <span class="hide-xs hide-sm text-small icon-mr">下一篇</span>
                    <i class="fa fa-angle-right" aria-hidden="true"></i>
                </a>
            </li>
        </ul>
    </nav>
    <ul class="post-actions post-action-share">
        <li class="post-action hide-lg hide-md hide-sm">
            <a class="post-action-btn btn btn--default btn-open-shareoptions" href="#btn-open-shareoptions" aria-label="Diesen Beitrag teilen">
                <i class="fa fa-share-alt" aria-hidden="true"></i>
            </a>
        </li>
        
            
            
            <li class="post-action hide-xs">
                <a class="post-action-btn btn btn--default" target="new" href="https://www.facebook.com/sharer/sharer.php?u=http://ml3426.oschina.io/Study/java-asm-study-0.html" title="分享到 Facebook">
                    <i class="fa fa-facebook-official" aria-hidden="true"></i>
                </a>
            </li>
        
            
            
            <li class="post-action hide-xs">
                <a class="post-action-btn btn btn--default" target="new" href="https://twitter.com/intent/tweet?text=http://ml3426.oschina.io/Study/java-asm-study-0.html" title="分享到 Twitter">
                    <i class="fa fa-twitter" aria-hidden="true"></i>
                </a>
            </li>
        
            
            
            <li class="post-action hide-xs">
                <a class="post-action-btn btn btn--default" target="new" href="https://plus.google.com/share?url=http://ml3426.oschina.io/Study/java-asm-study-0.html" title="分享到 Google+">
                    <i class="fa fa-google-plus" aria-hidden="true"></i>
                </a>
            </li>
        
        
            
                <li class="post-action">
                    <a class="post-action-btn btn btn--default" href="#gitment">
                         <i class="fa fa-comment-o"></i>
                    </a>
                </li>
            
        
        <li class="post-action">
            
                <a class="post-action-btn btn btn--default" href="#" aria-label="Nach oben">
            
                <i class="fa fa-list" aria-hidden="true"></i>
            </a>
        </li>
    </ul>
</div>


                </div>
                <div id="share-options-bar" class="share-options-bar" data-behavior="5">
    <i id="btn-close-shareoptions" class="fa fa-close"></i>
    <ul class="share-options">
        
            
            
            <li class="share-option">
                <a class="share-option-btn" target="new" href="https://www.facebook.com/sharer/sharer.php?u=http://ml3426.oschina.io/Study/java-asm-study-0.html">
                    <i class="fa fa-facebook-official" aria-hidden="true"></i><span>分享到 Facebook</span>
                </a>
            </li>
        
            
            
            <li class="share-option">
                <a class="share-option-btn" target="new" href="https://twitter.com/intent/tweet?text=http://ml3426.oschina.io/Study/java-asm-study-0.html">
                    <i class="fa fa-twitter" aria-hidden="true"></i><span>分享到 Twitter</span>
                </a>
            </li>
        
            
            
            <li class="share-option">
                <a class="share-option-btn" target="new" href="https://plus.google.com/share?url=http://ml3426.oschina.io/Study/java-asm-study-0.html">
                    <i class="fa fa-google-plus" aria-hidden="true"></i><span>分享到 Google+</span>
                </a>
            </li>
        
    </ul>
</div>

            
        </div>
        


    
        
    

<div id="about">
    <div id="about-card">
        <div id="about-btn-close">
            <i class="fa fa-remove"></i>
        </div>
        
            <img id="about-card-picture" src="http://oin1tuauu.bkt.clouddn.com/avatar.jpg" alt="作者的图片"/>
        
            <h4 id="about-card-name">ML3426</h4>
        
            <div id="about-card-bio"><p>author.bio</p>
</div>
        
        
            <div id="about-card-job">
                <i class="fa fa-briefcase"></i>
                <br/>
                <p>author.job</p>

            </div>
        
        
            <div id="about-card-location">
                <i class="fa fa-map-marker"></i>
                <br/>
                浙江杭州
            </div>
        
    </div>
</div>

        
            <div id="algolia-search-modal" class="modal-container">
    <div class="modal">
        <div class="modal-header">
            <span class="close-button"><i class="fa fa-close"></i></span>
            <a href="https://algolia.com" target="_blank" rel="noopener" class="searchby-algolia text-color-light link-unstyled">
                <span class="searchby-algolia-text text-color-light text-small">by</span>
                <img class="searchby-algolia-logo" src="https://www.algolia.com/static_assets/images/press/downloads/algolia-light.svg">
            </a>
            <i class="search-icon fa fa-search"></i>
            <form id="algolia-search-form">
                <input type="text" id="algolia-search-input" name="search"
                    class="form-control input--large search-input" placeholder="Search "
                    />
            </form>
        </div>
        <div class="modal-body">
            <div class="no-result text-color-light text-center">没有找到文章</div>
            <div class="results">
                
                <div class="media">
                    
                    <div class="media-left">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Essay/from2016to2017.html">
                            <img class="media-image" src="http://oin1tuauu.bkt.clouddn.com/image/jpg/6763119437_5b978e75a7_o.jpg-scale140" width="90" height="90"/>
                        </a>
                    </div>
                    
                    <div class="media-body">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Essay/from2016to2017.html">
                            <h3 class="media-heading">我的2016，我的2017</h3>
                        </a>
                        <span class="media-meta">
                            <span class="media-date text-small">
                                
                                    2017年1月12日
                                
                            </span>
                        </span>
                        <div class="media-content hide-xs font-merryweather"><p>随着舷窗外的空气由纯白色变成了淡淡的土黄色，飞机降落到了长沙黄花机场的跑道上，正式宣告着我的实习生活正式结束了，也宣告着我的2016年生活划上了一个句点。<br></div>
                    </div>
                    <div style="clear:both;"></div>
                    <hr>
                </div>
                
                <div class="media">
                    
                    <div class="media-left">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Essay/jobhunt-exp.html">
                            <img class="media-image" src="http://oin1tuauu.bkt.clouddn.com/image/jpg/jobhunt_exp_title.jpg-scale140" width="90" height="90"/>
                        </a>
                    </div>
                    
                    <div class="media-body">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Essay/jobhunt-exp.html">
                            <h3 class="media-heading">求职之路经验分享</h3>
                        </a>
                        <span class="media-meta">
                            <span class="media-date text-small">
                                
                                    2017年4月7日
                                
                            </span>
                        </span>
                        <div class="media-content hide-xs font-merryweather"><p>到了大三、大四的时候，所有人都面临着大学生活即将结束，接下来该如何前进的抉择。关于这个问题，出路无非是工作，留学，读研，创业这么几种。由于我是工作党，这里就跟大家分享一下我自己的求职经验和感想。<br></div>
                    </div>
                    <div style="clear:both;"></div>
                    <hr>
                </div>
                
                <div class="media">
                    
                    <div class="media-left">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Study/java-asm-study-0.html">
                            <img class="media-image" src="http://oin1tuauu.bkt.clouddn.com/c10e3.jpg-scale140" width="90" height="90"/>
                        </a>
                    </div>
                    
                    <div class="media-body">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Study/java-asm-study-0.html">
                            <h3 class="media-heading">ASM学习笔记0 - Hello World</h3>
                        </a>
                        <span class="media-meta">
                            <span class="media-date text-small">
                                
                                    2018年7月12日
                                
                            </span>
                        </span>
                        <div class="media-content hide-xs font-merryweather"><p>最近在工作中，遇到了一个可能大部分Java开发人员都遇到过的痛点，试用了几种其他的工具类框架，发现都有不是很满意的地方，因此就有了一个主意来自己写一个。但是在我的预想中，做这个工具需要和CGLib以及ASM打交道比较多，所以就打算从ASM以及CGLib开始学起，但是要学ASM，先学好JVM和字节码是前提。一边学习我也会一边产出我自己的学习笔记希望能够帮助到更多的人。<br></div>
                    </div>
                    <div style="clear:both;"></div>
                    <hr>
                </div>
                
                <div class="media">
                    
                    <div class="media-left">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Study/java-asm-study-1.html">
                            <img class="media-image" src="http://oin1tuauu.bkt.clouddn.com/c10e3.jpg-scale140" width="90" height="90"/>
                        </a>
                    </div>
                    
                    <div class="media-body">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Study/java-asm-study-1.html">
                            <h3 class="media-heading">ASM学习笔记1 - JNI字段描述符</h3>
                        </a>
                        <span class="media-meta">
                            <span class="media-date text-small">
                                
                                    2018年7月12日
                                
                            </span>
                        </span>
                        <div class="media-content hide-xs font-merryweather"><p>在之前的笔记中，我们看到了一段根据一个Java的HelloWorld程序反编译出来的字节码，在字节码的comment部分，我们看到了一些诸如<strong>[Ljava/lang/String</strong>或者<strong>()V</strong>之类的代码段，这样的代码段看起来与一般的类全路径有点像，但也有些不同。这样的写法，叫做JNI字段描述符。<br></div>
                    </div>
                    <div style="clear:both;"></div>
                    <hr>
                </div>
                
                <div class="media">
                    
                    <div class="media-left">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Study/java9-modularity-study-0.html">
                            <img class="media-image" src="http://oin1tuauu.bkt.clouddn.com/ek6c0.jpg-scale140" width="90" height="90"/>
                        </a>
                    </div>
                    
                    <div class="media-body">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Study/java9-modularity-study-0.html">
                            <h3 class="media-heading">Java9 Modularity - Chapter 1 笔记-模块化概述</h3>
                        </a>
                        <span class="media-meta">
                            <span class="media-date text-small">
                                
                                    2018年7月12日
                                
                            </span>
                        </span>
                        <div class="media-content hide-xs font-merryweather"><p>对于一个大型系统，系统的复杂度可能会超过我们理解和有效开发的能力范围。如果应用缺乏结构性，可能在之后的开发运维过程中付出巨大的代价。而模块化，则是用来管理和减少这种复杂性的技术之一。<br></div>
                    </div>
                    <div style="clear:both;"></div>
                    <hr>
                </div>
                
                <div class="media">
                    
                    <div class="media-left">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Study/java9-modularity-study-1.html">
                            <img class="media-image" src="http://oin1tuauu.bkt.clouddn.com/ek6c0.jpg-scale.title.wide" width="90" height="90"/>
                        </a>
                    </div>
                    
                    <div class="media-body">
                        <a class="link-unstyled" href="http://ml3426.oschina.io/Study/java9-modularity-study-1.html">
                            <h3 class="media-heading">Java9 Modularity - Chapter 2 笔记-模块和模块化JDK</h3>
                        </a>
                        <span class="media-meta">
                            <span class="media-date text-small">
                                
                                    2018年7月29日
                                
                            </span>
                        </span>
                        <div class="media-content hide-xs font-merryweather"><p>如图，目前在JDK9中定义了90多个平台模块（图中只画出了部分），JDK9就是由这90多个模块构成，而不是一个整体库。<br></div>
                    </div>
                    <div style="clear:both;"></div>
                    <hr>
                </div>
                
            </div>
        </div>
        <div class="modal-footer">
            <p class="results-count text-medium"
                data-message-zero="没有找到文章"
                data-message-one="找到 1 篇文章"
                data-message-other="找到 {n} 篇文章">
                找到 6 篇文章
            </p>
        </div>
    </div>
</div>

        
        
<div id="cover" style="background-image:url('/assets/images/cover.jpg');"></div>
        <!--SCRIPTS-->
<script src="/assets/js/script-xzfezjobyekpxrjktw5tz6muvzqfsbmo5n6atk3p5om9ulfptldi3p7cyqd8.min.js"></script>
<!--SCRIPTS END-->

    
        <script type="text/javascript">
            (function() {
                function render() {
                    new Gitment({
                        id: 'Thu Jul 12 2018 01:57:30 GMT+0800',
                        owner: 'FML3426',
                        repo: 'blog_gitcomment',
                        oauth: {
                            client_id: '0f00579407bcf3bb59ee',
                            client_secret: '491d910dd9e560666051f860569f53f1a737e3c9',
                        }
                    }).render('gitment');
                }
                var gc = document.createElement('script');
                gc.type = 'text/javascript';
                gc.src = '//imsun.github.io/gitment/dist/gitment.browser.js';
                gc.charset = 'UTF-8';
                gc.onload = render;
                gc.async = true;
                document.querySelector('body').appendChild(gc);
                var gcs = document.createElement('link');
                gcs.href = '//imsun.github.io/gitment/style/default.css';
                gcs.type = 'text/css';
                gcs.rel = 'stylesheet';
                gcs.media = 'screen,print';
                document.querySelector('head').appendChild(gcs);
            })();
	    </script>
    


    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment-with-locales.min.js"></script>
    <script src="//cdn.jsdelivr.net/algoliasearch/3/algoliasearch.min.js"></script>
    <script>
        var algoliaClient = algoliasearch('8QTBISJQTD', 'e228775761b8c86b2158a77831bc74f5');
        var algoliaIndex = algoliaClient.initIndex('osc_blog_index');
    </script>


    </body>
</html>
